// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported BoxPointer */
-const { Clutter, GObject, Shell, St } = imports.gi;
+const { Clutter, GObject, St } = imports.gi;
const Main = imports.ui.main;
let alignment = this._arrowAlignment;
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
- this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
+ this._sourceExtents = sourceActor.get_transformed_extents();
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
// Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
- let sourceAllocation = this._sourceAllocation;
- let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
- let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
+ let sourceTopLeft = this._sourceExtents.get_top_left();
+ let sourceBottomRight = this._sourceExtents.get_bottom_right();
+ let sourceCenterX = sourceTopLeft.x + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
+ let sourceCenterY = sourceTopLeft.y + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
let [, , natWidth, natHeight] = this.get_preferred_size();
// We also want to keep it onscreen, and separated from the
switch (this._arrowSide) {
case St.Side.TOP:
- resY = sourceAllocation.y2 + gap;
+ resY = sourceBottomRight.y + gap;
break;
case St.Side.BOTTOM:
- resY = sourceAllocation.y1 - natHeight - gap;
+ resY = sourceTopLeft.y - natHeight - gap;
break;
case St.Side.LEFT:
- resX = sourceAllocation.x2 + gap;
+ resX = sourceBottomRight.x + gap;
break;
case St.Side.RIGHT:
- resX = sourceAllocation.x1 - natWidth - gap;
+ resX = sourceTopLeft.x - natWidth - gap;
break;
}
}
_calculateArrowSide(arrowSide) {
- let sourceAllocation = this._sourceAllocation;
+ let sourceTopLeft = this._sourceExtents.get_top_left();
+ let sourceBottomRight = this._sourceExtents.get_bottom_right();
let [, , boxWidth, boxHeight] = this.get_preferred_size();
let workarea = this._workArea;
switch (arrowSide) {
case St.Side.TOP:
- if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
- boxHeight < sourceAllocation.y1 - workarea.y)
+ if (sourceBottomRight.y + boxHeight > workarea.y + workarea.height &&
+ boxHeight < sourceTopLeft.y - workarea.y)
return St.Side.BOTTOM;
break;
case St.Side.BOTTOM:
- if (sourceAllocation.y1 - boxHeight < workarea.y &&
- boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
+ if (sourceTopLeft.y - boxHeight < workarea.y &&
+ boxHeight < workarea.y + workarea.height - sourceBottomRight.y)
return St.Side.TOP;
break;
case St.Side.LEFT:
- if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
- boxWidth < sourceAllocation.x1 - workarea.x)
+ if (sourceBottomRight.x + boxWidth > workarea.x + workarea.width &&
+ boxWidth < sourceTopLeft.x - workarea.x)
return St.Side.RIGHT;
break;
case St.Side.RIGHT:
- if (sourceAllocation.x1 - boxWidth < workarea.x &&
- boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
+ if (sourceTopLeft.x - boxWidth < workarea.x &&
+ boxWidth < workarea.x + workarea.width - sourceBottomRight.x)
return St.Side.LEFT;
break;
}
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
- const transformedAllocation =
- Shell.util_get_transformed_allocation(this._dragActor);
+ const transformedExtents = this._dragActor.get_transformed_extents();
// Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup
this._dragActor.set_scale(
- transformedAllocation.get_width() / newAllocatedWidth,
- transformedAllocation.get_height() / newAllocatedHeight);
+ transformedExtents.get_width() / newAllocatedWidth,
+ transformedExtents.get_height() / newAllocatedHeight);
- this._dragOffsetX = transformedAllocation.x1 - this._dragStartX;
- this._dragOffsetY = transformedAllocation.y1 - this._dragStartY;
+ this._dragOffsetX = transformedExtents.origin.x - this._dragStartX;
+ this._dragOffsetY = transformedExtents.origin.y - this._dragStartY;
this._dragOrigParent.remove_actor(this._dragActor);
Main.uiGroup.add_child(this._dragActor);
}
}
-/**
- * shell_util_get_transformed_allocation:
- * @actor: a #ClutterActor
- * @box: (out): location to store returned box in stage coordinates
- *
- * This function is similar to a combination of clutter_actor_get_transformed_position(),
- * and clutter_actor_get_transformed_size(), but unlike
- * clutter_actor_get_transformed_size(), it always returns a transform
- * of the current allocation, while clutter_actor_get_transformed_size() returns
- * bad values (the transform of the requested size) if a relayout has been
- * queued.
- *
- * This function is more convenient to use than
- * clutter_actor_get_abs_allocation_vertices() if no transformation is in effect
- * and also works around limitations in the GJS binding of arrays.
- */
-void
-shell_util_get_transformed_allocation (ClutterActor *actor,
- ClutterActorBox *box)
-{
- /* Code adapted from clutter-actor.c:
- * Copyright 2006, 2007, 2008 OpenedHand Ltd
- */
- graphene_point3d_t v[4];
- gfloat x_min, x_max, y_min, y_max;
- guint i;
-
- g_return_if_fail (CLUTTER_IS_ACTOR (actor));
-
- clutter_actor_get_abs_allocation_vertices (actor, v);
-
- x_min = x_max = v[0].x;
- y_min = y_max = v[0].y;
-
- for (i = 1; i < G_N_ELEMENTS (v); ++i)
- {
- if (v[i].x < x_min)
- x_min = v[i].x;
-
- if (v[i].x > x_max)
- x_max = v[i].x;
-
- if (v[i].y < y_min)
- y_min = v[i].y;
-
- if (v[i].y > y_max)
- y_max = v[i].y;
- }
-
- box->x1 = x_min;
- box->y1 = y_min;
- box->x2 = x_max;
- box->y2 = y_max;
-}
-
/**
* shell_util_get_week_start:
*